<?php

namespace Lib\Base;

class Validate
{
    /**
     * 检查邮件信息是否正确
     * @param string $email 待检查的邮件
     * @return bool  true-正确，false-错误
     */
    public static function checkEmail($email)
    {
        if (!preg_match('/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/', $email)) {
            return false;
        }
        return true;
    }

    /**
     * 检查手机号是否正确
     * @param string $mobile 待检查的手机号码
     * @return bool  true-手机号正确，false-手机号错误
     */
    public static function checkMobile($mobile)
    {
        if (!preg_match('/^1[3456789]\d{9}$/', $mobile)) {
            return false;
        }
        return true;
    }

    /**
     * 检查openid是否正确
     * @param string $openid  需要检查的openid
     * @param string $type openid需要满足的账号体系，$type = qq|wx|wq
     *               qq：表示openid需要满足QQ账号的openid规则
     *               wx：表示openid需要满足微信账号的openid规则要求
     *               wq：表示openid满足微信或者QQ任意一种规则对openid的要求即可
     * @param bool true-满足要求，false-不满足要求
     */
    public static function checkOpenid($openid, $type = 'qq')
    {
        $reg = '';
        if ($type == 'qq') {
            $reg = '/^[0-9A-Z]{32}$/';
        } else if ($type == 'wx' || $type == 'wq') {
            $reg = '/^[\dA-Za-z-_]{28,64}$/';
        } else {
            return false;
        }
        $matchNum = preg_match($reg, $openid);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查gopenid是否合法
     * @param int $gopenid 需要检查的gopenid
     * @return bool true-合法，false-不合法
     */
    public static function checkGopenid($gopenid)
    {
        $matchNum = preg_match('/^[1-9]\d{9,19}$/', $gopenid);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查QQ号是否正确
     * @param int $qq 需要检查的QQ号
     * @param bool true-是QQ号，false-不是QQ号
     */
    public static function checkQQ($qq)
    {
        $matchNum = preg_match('/^[1-9]\d{4,9}$/', $qq);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查账号是否为openid或者QQ号
     * @param string $uin 要检查的账号ID
     * @return bool true-正常的账号ID， false-异常账号ID
     *
     */
    public static function checkUin($uin)
    {
        if (self::checkOpenid($uin, 'wq') || self::checkQQ($uin) || self::checkGopenid($uin)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 检查大区是否符合要求
     * @param string $area 待检查的大区值
     * @param string $game 游戏业务码,根据游戏业务进行精确检测
     * @return bool true-大区正确，false-大区错误
     */
    public static function checkArea($area, $game = '')
    {
        $matchNum = preg_match('/^[1-9]\d{0,4}$/', $area);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查平台是否符合要求
     * @param string $plat 待检查的平台值
     * @return bool true-平台正确，false-平台错误
     */
    public static function checkPlat($plat)
    {
        return in_array($plat, array('0', '1'));
    }

    /**
     * 检查游戏区服是否正确
     * @param string $partition 待检查的游戏区服值
     * @return bool true-区服正确，false-区服错误
     */
    public static function checkPartition($partition)
    {
        $matchNum = preg_match('/^[1-9]\d{0,5}$/', $partition);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查角色ID是否正确
     * @param string $roleId 待检查的角色ID
     * @param int $type 角色满足的条件，$type = 1|2,1-正整数，2-字母和数字
     * @return bool true-角色ID正确，false-角色ID错误
     */
    public static function checkRoleId($roleId, $type = 2)
    {
        $reg = '/^[1-9]\d{0,19}$/';
        if ($type == 2) {
            $reg = '/^[a-zA-Z0-9-_]{1,64}$/';
        }
        $matchNum = preg_match($reg, $roleId);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 验证是否为自然数
     * @param string $number 需要验证的字符
     * @param string $checkZero 是否允许包含0。1-是，0-否
     * @return boolean true-自然数，false-非自然数
     */
    public static function checkNaturalNum($number, $checkZero = 0)
    {
        $expression = $checkZero ? '/^\d+$/' : '/^[1-9]\d*$/';
        $matchNum = preg_match($expression, $number);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 验证是否为整数
     * @param string $number 需要验证的字符
     * @return boolean true-整数，false-非整数
     */
    public static function checkInt($number)
    {
        $expression = '/^-?[1-9]\d*$/';
        $matchNum = preg_match($expression, $number);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查是否为合法的url
     * @param string $url 待检查的URL
     * @return bool true-url正确，false-url错误
     */
    public static function checkQQUrl($url)
    {
        $matchNum = preg_match('/^http(s?):\/\/([a-zA-Z0-9-_\.]+?)\.(qq\.com|qlogo\.cn|qpic\.cn)\//', $url);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查是否为合法的MRMS单号
     * @param string $mrmsId 待检查的礼包单号
     * @return bool true-正确，false-错误
     */
    public static function checkMRMSID($mrmsId)
    {
        $matchNum = preg_match('/^IEGAMS-\d+-\d+$/', $mrmsId);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查是否为合法的角色信息参数字符串
     * @param string $roleParam 待检查的角色信息参数字符串
     * @return bool true-正确，false-错误
     */
    public static function checkRoleParam($roleParam)
    {
        $matchNum = preg_match('/^[0-9A-Za-z-_\|\*%]{1,500}$/', $roleParam);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 校验角色相关的参数是否合法
     * @param array $data 待校验的角色参数
     * @param array $result 引用传递，返回具体的错误信息
     * @return bool true-角色参数合法，false-角色参数不合法
     */
    public static function checkRoleData($data, &$result = [])
    {
        $result = ['iRet' => 0, 'sMsg' => 'success'];
        if (isset($data['area']) && !Validate::checkArea($data['area'])) {
            $result = ['iRet' => -1000001, 'sMsg' => '渠道area错误！'];
            return false;
        }
        if (isset($data['sArea']) && !Validate::checkArea($data['sArea'])) {
            $result = ['iRet' => -1000002, 'sMsg' => '渠道sArea错误！'];
            return false;
        }

        if (isset($data['platId']) && !Validate::checkPlat($data['platId'])) {
            $result = ['iRet' => -1000003, 'sMsg' => '平台platId错误！'];
            return false;
        }
        if (isset($data['sPlatId']) && !Validate::checkPlat($data['sPlatId'])) {
            $result = ['iRet' => -1000004, 'sMsg' => '平台sPlatId错误！'];
            return false;
        }

        if (isset($data['partition']) && !Validate::checkPartition($data['partition'])) {
            $result = ['iRet' => -1000005, 'sMsg' => '区服partition错误！'];
            return false;
        }
        if (isset($data['sPartition']) && !Validate::checkPartition($data['sPartition'])) {
            $result = ['iRet' => -1000006, 'sMsg' => '区服sPartition错误！'];
            return false;
        }

        if (isset($data['roleId']) && !Validate::checkRoleId($data['roleId'])) {
            $result = ['iRet' => -1000007, 'sMsg' => '角色roleId错误！'];
            return false;
        }
        if (isset($data['sRoleId']) && !Validate::checkRoleId($data['sRoleId'])) {
            $result = ['iRet' => -1000008, 'sMsg' => '角色sRoleId错误！'];
            return false;
        }

        if (isset($data['openid']) && !Validate::checkUin($data['openid'])) {
            $result = ['iRet' => -1000009, 'sMsg' => '账号openid错误！'];
            return false;
        }
        if (isset($data['sGameOpenid']) && !Validate::checkUin($data['sGameOpenid'])) {
            $result = ['iRet' => -1000010, 'sMsg' => '账号sGameOpenid错误！'];
            return false;
        }
        if (isset($data['iUin']) && !Validate::checkUin($data['iUin'])) {
            $result = ['iRet' => -1000011, 'sMsg' => '账号iUin错误！'];
            return false;
        }
        return true;
    }

    /**
     * 检查是否为合法的角色信息校验字符串
     * @param string $roleStr 待检查的校验字符串
     * @return bool true-正确，false-错误
     */
    public static function checkRoleStr($roleStr)
    {
        $matchNum = preg_match('/^[0-9A-Fe-f]{32}$/', $roleStr);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 校验日期是否合法
     * @param string $date 需要校验的日期
     * @param string $format 日期需要满足的格式
     * @return bool true-正确，false-错误
     */
    public static function checkDate($date, $format = 'Y-m-d H:i:s')
    {
        $d = \DateTime::createFromFormat($format, $date);
        return $d && $d->format($format) == $date;
    }

    /**
     * 检查微信号是否合法
     * @param string $idcard 待检查的微信号
     * @return bool true-微信号合法，false-微信号非法
     */
    public static function checkWechat($wechat)
    {
        $matchNum = preg_match('/^[a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}$/', $wechat);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查企业微信账号是否合法
     * @param string $rtxName 待检查的企业微信账号
     * @return bool true-账号合法，false-账号非法
     */
    public static function checkRtx($rtxName)
    {
        $matchNum = preg_match('/^(v_)?[a-z]{3,20}$/', $rtxName);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查身份证是否合法
     * @param string $idcard 待检查的身份证
     * @return bool true-idcard合法，false-idcard非法
     */
    public static function checkIdCard($idcard)
    {
        $matchNum = preg_match('/^[1-9]\d{16}[0-9X]$/', $idcard);
        return $matchNum === 1 ? true : false;
    }

    /**
     * 检查appid是否合法
     * @param string $appid 需要检查的appid
     * @param string $type 取值范围：qq|wx|wq qq-QQ平台，wx-微信平台，wq-微信和QQ平台
     * @return bool true-合法appid，false-非法appid
     */
    public static function checkAppid($appid, $type = 'wq')
    {
        $pattern = '';
        if ($type == 'wx') {
            $pattern = '/^wx[a-f0-9]{16}$/';
        } else if ($type == 'qq') {
            $pattern = '/^[1-9]\d{4,14}$/';
        } else if ($type == 'wq') {
            $pattern = '/^(wx[a-f0-9]{16})|([1-9]\d{4,14})$/';
        } else {
            return false;
        }

        $matchNum = preg_match($pattern, $appid);
        return $matchNum === 1 ? true : false;
    }

    public static function checkScode($scode)
    {
        $matchNum = preg_match('/^[0-9A-Za-z-_%=\/\+]{20,}$/', $scode);
        return $matchNum === 1 ? true : false;
    }

    public static function checkUid1($uid1)
    {
        $matchNum = preg_match('/^[0-9A-Za-z]{1,20}$/', $uid1);
        return $matchNum === 1 ? true : false;
    }

    public static function checkBizCode($code)
    {
        $matchNum = preg_match('/^[0-9A-Za-z][0-9A-Za-z_-\.]{0,14}$/', $code);
        return $matchNum === 1 ? true : false;
    }
}
